iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
0
自我挑戰組

純新手學習 JavaScript系列 第 19

新手學習JavaScript:day19 - Maximum Product of Three Numbers

  • 分享至 

  • xImage
  •  

今天開始讓我來連續一個禮拜的leetcode刷題吧!直接來看今天的題目:

/*
Given an integer array, find three numbers whose product is maximum and output the maximum product.

Example 1:

Input: [1,2,3]
Output: 6
 

Example 2:

Input: [1,2,3,4]
Output: 24
 

Note:

The length of the given array will be in range [3,104] and all elements are in the range [-1000, 1000].
Multiplication of any three numbers in the input won't exceed the range of 32-bit signed integer.
*/
var maximumProduct = function(nums) {
   
};

這題需要從一個數字陣列中找出三個數字相乘的結果為最大。

解題思考:
剛開始在看的時候直覺想說

  1. 先將陣列做升冪陣列排序
  2. 找出最後三個數字相乘

所以一開始這樣寫:

var maximumProduct = function(nums) {
   let ascending = nums.sort((a, b) => a - b)
   let result = ascending[nums.length -1]* ascending[nums.length -2]* ascending[nums.length -3]
   return result
};

但後來submit後被打臉,完全忘記考慮負數的情況,舉例來說:輸入是[60,-3,-1,-4] 經過排序[-4,-3,-1,60],最後三個相乘是180,但預期結果是720。

再次思考

  1. 先假設全部都是負數陣列並經過排序[-20,-19,-10,-9,-5,-3,-1],三個數字相乘結果一定是負的,所以要找絕對值最小的,那其實也是找最後三個數相乘。
  2. 那如果陣列中有一個以上的負數且正數少於三個,例如[-2,-1,10,60],要得到最大的值,就要取負數最小的兩個相乘,再與正數最大值相乘。
  3. 如果說正數多於三個,例如:[-15,-2,-1,0,10,30,60],依然要會找最後三個正數,但我們在不知道輸入的負數值的大小,我們必須同時去比較第二點的作法與第一點的作法,再輸出最大的結果。
var maximumProduct = function(nums) {
   let ascending = nums.sort((a, b) => a - b)
   let firstCase = ascending[nums.length -1]* ascending[nums.length -2]* ascending[nums.length -3]
   let secondCase = ascending[0] * ascending[1] * ascending[nums.length - 1]
   return Math.max(firstCase, secondCase)
};

以上是今天內容!


上一篇
新手學習JavaScript:day18 - 陣列的方法
下一篇
新手學習JavaScript:day20 - Sum of Even Numbers After Queries
系列文
純新手學習 JavaScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言